﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.Security;
using System.Xml;
using System.Text;
using System.IO;
using DataReceive;

public partial class receive : System.Web.UI.Page
{
    public string msgReturn = "";//返回数据
    private void Page_Load(object sender, System.EventArgs e)
    {
        try
        {
            string kqkey_path = HttpContext.Current.Server.MapPath("Certificates") + "\\" + ConfigurationManager.AppSettings["kqkey_path"].ToString();//从配置文件获取快钱证书路径:kqkey_path
            string kqkey_password = ConfigurationManager.AppSettings["kqkey_password"].ToString();//从配置文件获取快钱证书密码: kqkey_password

            msgReturn = new KQHelper().GetTR3(); //获取TR3返回的XML数据

            //以下为返回TR3测试XML数据
            //msgReturn="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><MasMessage xmlns=\"http://www.99bill.com/mas_cnp_merchant_interface\"><version>1.0</version><TxnMsgContent><txnType>PUR</txnType><interactiveStatus>TR3</interactiveStatus><amount>100</amount><merchantId>104110045110201</merchantId><terminalId>00000201</terminalId><entryTime>20090731135625</entryTime><externalRefNumber>PUR_20090731135617</externalRefNumber><transTime>20090731135602</transTime><refNumber>000000007701</refNumber><responseCode>00</responseCode><cardOrg>CU</cardOrg><storableCardNo>5528010001</storableCardNo><authorizationCode>168426</authorizationCode><signature>Xe2LZZmM/eV7rKf+lUQKEMDCbJnJyLdHu4YZbVgy0eqmsFv1+GO0Eyp5S7jZRBLjyKilUYxf1xo0PnkK0dhkgHspkU7elA5Q3+V7Jm+WGS0HfwV4RkRNgQB02weXWj1E+dH+bGYXb/wQRujUfGAAe9TINhKGWErlR69fadKr6rc=</signature></TxnMsgContent></MasMessage>";

            ////商家一定要添加日志，商家以自己的方式添加日志，以下写XML只做临时测试用
            ////******特别注意：以下部分为:将获取的TR3数据存入文件(xml\receive\),调试完要把该出代码删除，以免正式上线后生成很多垃圾文件，******************
            string tr3Return = msgReturn.Replace(" xmlns=\"http://www.99bill.com/mas_cnp_merchant_interface\"", "");//去掉获取到的TR3数据中的xmlns属性，否则加载不到对象中
            XmlDocument xmlResponsetr3 = new XmlDocument();
            xmlResponsetr3.LoadXml(tr3Return);
            XmlNode node = xmlResponsetr3.SelectSingleNode("MasMessage/TxnMsgContent/externalRefNumber");	//获取查询返回数据中的外部跟踪编号（externalRefNumber）
            string logPathtr3 = HttpContext.Current.Request.PhysicalApplicationPath + "xml\\receive\\" + node.InnerText.ToString() + "_TR3Receive.xml";
            xmlResponsetr3.Save(logPathtr3);
            ////******写入文件结束******************

            string xmlReturn = msgReturn.Replace(" xmlns=\"http://www.99bill.com/mas_cnp_merchant_interface\"", "");//去掉获取到的TR3数据中的xmlns属性，否则加载不到对象中
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xmlReturn);//加载XML
            XmlNodeList list = xmlDoc.SelectNodes("//TxnMsgContent");// TxnMsgContent节点放入列表
            if (list.Count == 0)//判断TxnMsgContent有没有数据，有数据表示有记录返回，没有表示出错
            {
                //获取错误信息
                string errorMessage = xmlDoc.SelectSingleNode("MasMessage/ErrorMsgContent/errorMessage").InnerText.ToString();
                KQHelper.mg = errorMessage; //显示错误信息
            }   
            else
            {
                string signMsg = xmlDoc.SelectSingleNode("MasMessage/TxnMsgContent/signature").InnerText.ToString();//获取快钱返回的签名
                string sXML = msgReturn.Replace("<signature>" + signMsg + "</signature>","");//要验签的字符串是从快钱返回的XML中去掉<signature>节点后的值拿来验签               
               
                ////证书验签开始（1：要验签的字符串，2：签名，3：证书地址，4：证书密码）
                if (KQHelper.SHA1Verify(sXML, signMsg, kqkey_path, kqkey_password))//验签成功
                {
                    string responseCode = xmlDoc.SelectSingleNode("MasMessage/TxnMsgContent/responseCode").InnerText.ToString();//获取应答码，如果要获取TxnMsgContent节点下其他节点数据，也用此方式
                    string txnType = xmlDoc.SelectSingleNode("MasMessage/TxnMsgContent/txnType").InnerText.ToString();//获取交易类型，
                    string refNumber = xmlDoc.SelectSingleNode("MasMessage/TxnMsgContent/refNumber").InnerText.ToString();//获取系统参考号，
                    string backtxnType = xmlDoc.SelectSingleNode("MasMessage/TxnMsgContent/txnType").InnerText.ToString();//获取交易类型
                    if (responseCode == "00")//00表示交易成功，
                    {
                        KQHelper.mg = responseCode;
                        //此处可插入商户逻辑处理，将订单信息更新数据库，注意做的时候要根据获取的交易类型txnType分别做不同的数据库更新
                        //如： if(txnType=="PUR"){做消费的数据库逻辑处理}；if(txnType=="PRE"){做预授权的数据库逻辑处理}
                        switch (backtxnType)
                        {
                            case "PUR"://消费
                                //根据交易类型不同做不同的数据库处理
                                break;
                            case "PRE"://预授权交易
                                //根据交易类型不同做不同的数据库处理
                                break;
                            case "CFM"://预授权完成交易
                                //根据交易类型不同做不同的数据库处理
                                break;
                            case "INP"://分期消费交易
                                //根据交易类型不同做不同的数据库处理
                                break;
                            case "VTX"://撤销交易
                                //根据交易类型不同做不同的数据库处理
                                break;
                            case "RFD"://退货交易
                                //根据交易类型不同做不同的数据库处理
                                break;
                            default:
                                //其他类型交易暂时不做数据记录和处理
                                break;
                        }
                    }
                    else
                    {
                        //要么返回C0：交易正在处理中，要么返回支付失败的错误代码
                        KQHelper.mg = responseCode;
                    }

                    //TR4发送XML开始
                    string merchantId = ConfigurationManager.AppSettings["merchantId"].ToString();//从配置文件获取商户号:merchantId
                    string terminalId = ConfigurationManager.AppSettings["terminalId"].ToString();//从配置文件获取终端号:terminalId
                    //定义请求的XML数据
                    string reqXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><MasMessage xmlns=\"http://www.99bill.com/mas_cnp_merchant_interface\">";
                    reqXml += "<version>1.0</version>";	//版本号
                    reqXml += "<TxnMsgContent>";	//提交数据节点
                    reqXml += "<txnType>{0}</txnType>";	//交易类型
                    reqXml += "<interactiveStatus>TR4</interactiveStatus>";	//消息状态
                    reqXml += "<merchantId>{1}</merchantId>";	//商户编号
                    //reqXml += "<settleMerchantId />";	//结算商户编号：如果有子结算帐号，则要传子帐户编号,没有则不传该节点
                    reqXml += "<terminalId>{2}</terminalId>";	//终端号
                    reqXml += "<refNumber>{3}</refNumber>";	//系统参考号
                    reqXml += "</TxnMsgContent>";
                    reqXml += "</MasMessage>";
                    reqXml = string.Format(reqXml, txnType.Trim(), merchantId.Trim(), terminalId.Trim(), refNumber.Trim());

                    new KQHelper().SendTR4(reqXml);//发送TR4

                    ////商家一定要添加日志，商家以自己的方式添加日志，以下写XML只做临时测试用
                    ////******特别注意：以下部分为:将发送的TR4数据存入文件(xml\send\),调试完要把该出代码删除，以免正式上线后生成很多垃圾文件，******************
                    string tr4Xml = reqXml.Replace(" xmlns=\"http://www.99bill.com/mas_cnp_merchant_interface\"", "");//去掉获取到的TR4数据中的xmlns属性，否则加载不到对象中
                    string logPathtr4 = HttpContext.Current.Request.PhysicalApplicationPath + "xml\\send\\" + refNumber.Trim() + "_TR4Send.xml";
                    XmlDocument xmlResponsetr4 = new XmlDocument();
                    xmlResponsetr4.LoadXml(tr4Xml);
                    xmlResponsetr4.Save(logPathtr4);
                    ////******写入文件结束******************
                    ////tr4发送结束

                }
                else//验签失败
                {
                    string sStr = "获取的tr3数据验签错误。";
                    KQHelper.mg = "处理出现异常，" + sStr; //返回错误
                    ////商家一定要添加日志，商家以自己的方式添加日志，以下写XML只做临时测试用
                    //******特别注意：以下部分为:将验签结果数据存入文件(xml\receive\),调试完要把该出代码删除，以免正式上线后生成很多垃圾文件，******************
                    string errReturn = msgReturn.Replace(" xmlns=\"http://www.99bill.com/mas_cnp_merchant_interface\"", "");//去掉获取到的TR3数据中的xmlns属性，否则加载不到对象中
                    XmlDocument xmlResponsetrerr = new XmlDocument();
                    xmlResponsetrerr.LoadXml(errReturn);
                    string logPathtrerr = HttpContext.Current.Request.PhysicalApplicationPath + "xml\\receive\\" + "_errorTR3Receive.xml";
                    xmlResponsetrerr.Save(logPathtrerr);
                    //******写入文件结束******************
                }
            }
        }

        catch(Exception m)
        {
            string ms = m.Message.ToString();
            KQHelper.mg = "处理出现异常，" + msgReturn + ms;
        }

    }

}
